package com.xinzhidi.web.netty.utils.household;

import com.xinzhidi.web.netty.utils.HexadecimalUtil;
import com.xinzhidi.web.sim.domain.SimCard;
import org.springframework.stereotype.Component;

/***
 * 户用阀门协议工具类
 * @author cx
 * @date 2023/6/5 14:47
 */
@Component
public class HouseholdUtil {

    /**
     * 前缀
     */
    private static final String PREFIX = "FEFEFE";

    /**
     * 起始符
     */
    private static final String START_CHAR = "68";

    /**
     * 设备类型
     */
    private static final String DEVICE_TYPE = "46";

    /**
     * 控制码-阀门工作模式  主-从
     */
    private static final String VALVE_OPERATING_MODE_MAIN_CODE = "04";

    /**
     * 控制码-阀门工作模式  从-主
     */
    private static final String VALVE_OPERATING_MODE_FROM_CODE = "84";

    /**
     * 长度域-阀门工作模式  主-从
     */
    private static final String VALVE_OPERATING_MODE_MAIN_LENGTH_FIELD = "02";

    /**
     * 长度域-阀门工作模式  从-主
     */
    private static final String VALVE_OPERATING_MODE_FROM_LENGTH_FIELD = "02";


    /**
     * 数据域（指令）-阀门工作模式  主-从
     */
    private static final String VALVE_OPERATING_MODE_MAIN_LENGTH_DATA_FIELD_INSTRUCT = "09";

    /**
     * 数据域（指令）-阀门工作模式  从-主
     */
    private static final String VALVE_OPERATING_MODE_FROM_LENGTH_DATA_FIELD_INSTRUCT = "09";

    /**
     * 结束符
     */
    private static final String END_MARK = "16";


    /**
     * 设置阀门工作模式 md文档3.1  主-从
     * 通讯帧目的：对全部阀门或单个阀门进行工作模式设置
     *
     * @param simCard           sim卡
     * @param controlCode       控制码
     * @param lengthField       长度域
     * @param dataFieldInstruct 数据域指令
     * @param dataFieldData     数据域数据
     * @return void
     * @author cx
     * @date 2023/6/5 18:38
     **/
    public String setValveOperationMode(SimCard simCard, String controlCode, String lengthField, String dataFieldInstruct, String dataFieldData) {
        String message = PREFIX + START_CHAR + DEVICE_TYPE + simCard.getAddress() + controlCode + lengthField + dataFieldInstruct + dataFieldData;
        //获取校验码
        String checkCode = HexadecimalUtil.getCheckCode(message);
        message += checkCode + END_MARK;
        return message;
    }
}
